#include "mc920.h"

int main(int argc, char **argv) {
  Image *img,*magview,*filt[3],*kernel[3],*fimg[3];
  Spectrum  *img_spec,*filt_spec[3],*fimg_spec[3];
  char filename[100];
  int i;

  if (argc!=2) {
    fprintf(stderr,"usage: fftdemo <image> \n");
    fprintf(stderr,"image: arquivo de imagem pgm\n");    
    exit (-1);
  }

  img = ReadImage(argv[1]);

  /* Calcula FFT da imagem e grava magnitude para visualizacao */

  img_spec  = FFT2D(img);
  magview   = ViewMagnitude(img_spec);
  WriteImage(magview,"imagem-magnitude.pgm");
  DestroyImage(&magview);

  /* Gera imagem de um kernel Gaussiano/Sobel, adiciona zeros para
     ficar na resolucao da imagem, calcula sua transformada e grava
     magnitude para visualizacao. */

  kernel[0]  = MakeImage("3,3,1,2,1,2,4,2,1,2,1");   
  kernel[1]  = MakeImage("3,3,-1,-2,-1,0,0,0,1,2,1");   
  kernel[2]  = MakeImage("3,3,-1,0,1,-2,0,2,-1,0,1");   
  for (i=0; i < 3; i++) {
    filt[i]      = AddZeros(kernel[i],img->ncols-3,img->nrows-3);
    filt_spec[i] = FFT2D(filt[i]);
    magview      = ViewMagnitude(filt_spec[i]);
    sprintf(filename,"filter-%d-magnitude.pgm",i+1);
    WriteImage(magview,filename);
    DestroyImage(&magview);
    DestroyImage(&kernel[i]);
  }

  /* Aplica a filtragem na frequencia */

  for (i=0; i < 3; i++) {
    fimg_spec[i] = MultSpectrum(img_spec,filt_spec[i]);
    fimg[i]      = InvFFT2D(fimg_spec[i]);
  }

  WriteImage(fimg[0],"imagem-suavizada.pgm");
  DestroyImage(&img);
  img       = ImageMagnitude(fimg[1],fimg[2]);
  WriteImage(img,"realce-bordas.pgm");

  for (i=0; i < 3; i++) {
    DestroyImage(&fimg[i]);
    DestroySpectrum(&filt_spec[i]);
    DestroySpectrum(&fimg_spec[i]);
    DestroyImage(&filt[i]);
  }

  DestroyImage(&img);
  DestroySpectrum(&img_spec);

  /* Crie imagem do cosseno */

  img      = CreateCos(256,256,32,32,0,0);
  WriteImage(img,"cosseno.pgm");
  img_spec = FFT2D(img);
  magview  = ViewMagnitude(img_spec);
  WriteImage(magview,"cosseno-magnitude.pgm");
  DestroyImage(&magview);


  return 0;
}

